package com.passion.mq.rabbitmq.queue1;

import com.alibaba.fastjson2.JSON;
import com.passion.context.MiddlewareContext;
import com.passion.domain.entity.SysUser;
import com.passion.mq.AbstractUserOperationMq;
import com.passion.mq.annotation.AsyncMQ;
import com.passion.mq.config.RabbitMqConfig;
import com.passion.vo.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 类描述：在对应业务操作时发送消息到MQ的生产者
 * 系统中对于异步处理的情况，均可以发送消息到MQ，然后再由接收者进行处理
 * @author ZhuYin
 * @since 2024年12月29日
 */
@AsyncMQ(executor = "asyncLogTaskThreadPool")
@Slf4j
@Component("userOperationRabbitMqQueueProducer")
@ConditionalOnBean(RabbitMqConfig.class)
public class UserOperationQueueProducer extends AbstractUserOperationMq {

    private static final String OPERATION_TYPE = "operationType";

    /**
     * 方法说明：用户登录MQ消息
     *
     * @param user 登录的用户对象
     * @author ZhuYin
     * @since 2024年12月29日
     */
    @Override
    public void userLoginMq(LoginUser user) {
        Map<String, Object> map = MiddlewareContext.objectMapper.convertValue(user, Map.class);
        map.put(OPERATION_TYPE, "userLogin");
        MiddlewareContext.mqSender.sendMessage(UserOperationQueueConfig.queueName, JSON.toJSONString(map));
    }

    /**
     * 方法说明：用户修改密码MQ消息
     *
     * @param user      修改密码的用户对象
     * @param oldPasswd 旧密码
     * @param newPasswd 新密码
     * @author ZhuYin
     * @since 2024年12月29日
     */
    @Override
    public void userChangePasswdMq(SysUser user, String oldPasswd, String newPasswd) {
        log.info("用户修改密码：{} 发送MQ消息", user);
        Map map = MiddlewareContext.objectMapper.convertValue(user, Map.class);
        map.put(OPERATION_TYPE, "userChangePasswd");
        map.put("oldPasswd", oldPasswd);
        map.put("newPasswd", newPasswd);
        MiddlewareContext.mqSender.sendMessage(UserOperationQueueConfig.queueName, JSON.toJSONString(map));
    }
}
